/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.edu.ufcg.boombox.controller;

import java.awt.event.ActionListener;
import java.util.*;
import br.edu.ufcg.boombox.model.RepositoryManager;
import br.edu.ufcg.boombox.model.Usuario;

/**
 *
 * @author Targaryen
 */
public class ContextoDaAplicacao {

    private static ContextoDaAplicacao instance = null;
    
    //mapa de usuarios logados
    private static Map<String, Usuario> usuariosLogados = new TreeMap<String, Usuario>();
    
    
    //o contexto da aplicacao pode possuir outros objetos como controladores.
    private static Usuario usuarioDestaSessao = null;
    
    // Controllers
    private static Map<String, Inicializavel> controladores = new TreeMap<String, Inicializavel>();
    

    protected ContextoDaAplicacao() {
        // Exists only to defeat instantiation.
    }

    public static ContextoDaAplicacao getInstance() {
        if (instance == null) {
            instance = new ContextoDaAplicacao();
        }
        return instance;
    }
    
    public void adicionarControlador(String nome, Inicializavel controlador) {
        this.controladores.put(nome, controlador);
    }
    
    public int getQuantidadeDeControladores() {
        return this.controladores.size();
    }
    
    public Inicializavel getControlador(String nome) {
        return this.controladores.get(nome);
    }
    
    public String logar(String login, String senha) throws FalhaDeAutenticacaoException {
       
        Iterator<Usuario> iteradorDeUsuarios = RepositoryManager.getInstance().getRegistros().iterator();
        while (iteradorDeUsuarios.hasNext()) {
            Usuario usuario = iteradorDeUsuarios.next();
            if(usuario.getEmail().equals(login) && new String(usuario.getSenha()).equals(senha)) {
                if(!usuariosLogados.containsKey(login)) {
                    //verifica se o usuario ja estava logado.
                    //Se ja estiver logado, o usuario nao eh adicionado ao mapa usuariosLogados
                    // e apenas o idSession (email ou login) eh retornado.
                    usuariosLogados.put(usuario.getEmail(), usuario);
                    
                }
                this.usuarioDestaSessao = usuario;
                return login;
            }
        }
        throw new FalhaDeAutenticacaoException("Usuário ou senha inválidos!");
    }
    
    public void logoff() {
        ContextoDaAplicacao.usuariosLogados.remove(usuarioDestaSessao.getEmail());
        ContextoDaAplicacao.usuarioDestaSessao = null;
    }
    
//    public static void main(String[] args) throws FalhaDeAutenticacaoException {
//        System.out.println("Teste!");
//        ContextoDaAplicacao.getInstance().logar("email", "senha");
//    }
    
    public Usuario getUsuarioLogado() {
        return this.usuarioDestaSessao;
    }
    
}